package study.kit.el.zh.table;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import study.kit.el.zh.parse.CellVO;
import study.kit.el.zh.parse.RangeVO;
import study.kit.el.zh.parse.RowVO;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
public class Validator {

    /**
     * 验证头 1.数量 2.表头值
     *
     * @param header
     */
    public static void checkHeader(RowVO header) {
        //
        List<CellVO> cellVOLt = header.getCellVOLt();
        int maxColNum = cellVOLt.stream()
                .mapToInt(CellVO::getColNum)
                .max().getAsInt();
        log.info(">>>>>> header maxColNum= {}", maxColNum);
        //
        List<String> headerLt = cellVOLt.stream().map(e -> Convert.toStr(e.getValue()))
                .filter(e -> StrUtil.isNotEmpty(e))
                .collect(Collectors.toList());
        log.info(">>>>>> header= {}", headerLt);
        // 数量减1
        if (maxColNum != HeaderUtil.count() - 1 && HeaderUtil.isLegal(headerLt)) {
            log.error(">>>>>> 标题错误");
        } else {
            log.error(">>>>>> 标题验证通过");
        }
    }

    /**
     * 验证合并 1.行合并 2.列合并
     *
     * @param rangeLt
     * @param header
     */
    public static void checkMerge(List<RangeVO> rangeLt, RowVO header) {
        //
        List<Integer> noMergeColNumLt = HeaderUtil.getNoRowMergeColNumLt(header);
        log.info(">>>>>> 禁止合并列: {}", noMergeColNumLt);
        //
        for (RangeVO range : rangeLt) {
            // 合并信息
            Integer rowNum = range.getRowNum(), colNum = range.getColNum();
            Integer rowCnt = range.getRowCnt(), colCnt = range.getColCnt();
            // 列合并
            if (colCnt > 1) {
                log.error(">>>第 {} 行从第 {} 列开始有 {} 列 合并", rowNum, colNum, colCnt);
                //throw new IllegalStateException("列合并");
            }
            // 行合并
            if (rowCnt > 1 && CollectionUtil.contains(noMergeColNumLt, colNum)) {
                log.error(">>>第 {} 行从第 {} 列开始有 {} 行 合并", rowNum, colNum, rowCnt);
                //throw new IllegalStateException("列合并");
            }
        }
    }

    /**
     * 验证数据
     *
     * @param colName
     * @param value
     * @param rowNum
     * @param colNum
     */
    public static void checkData(String colName, Object value, int rowNum, int colNum) {
        //
        RuntimeException ex = new IllegalArgumentException(StrUtil.format("参数错误({}, {})", rowNum, colNum));
        //
        if (StrUtil.equals(colName, "季度")) { // 必填
            String myValue = Convert.toStr(value);
            log.info("============ {}", myValue);
            if (StrUtil.isEmpty(myValue) || !CollectionUtil.contains(Arrays.asList("暑假", "寒假"), myValue)) {
                log.info("第 {} 行 第 {} 列 数据为空或值非法: {}", rowNum, colNum, value);
                throw ex;
            }
        } else if (StrUtil.equals(colName, "课次")) { // 必填
            if (StrUtil.isEmpty(Convert.toStr(value))) {
                throw ex;
            }

        } else if (StrUtil.equals(colName, "课次名称")) { // 必填
            if (StrUtil.isEmpty(Convert.toStr(value))) {
                throw ex;
            }

        } else if (StrUtil.equals(colName, "知识点")) { // 必填
            if (StrUtil.isEmpty(Convert.toStr(value))) {
                throw ex;
            }

        } else if (StrUtil.equals(colName, "切片链接")) { // 必填
            if (StrUtil.isEmpty(Convert.toStr(value))) {
                throw ex;
            }

        } else if (StrUtil.equals(colName, "难度")) {
            if (StrUtil.isNotEmpty(Convert.toStr(value))) {
                throw ex;
            }

        } else if (StrUtil.equals(colName, "首三推荐")) {
            if (StrUtil.isEmpty(Convert.toStr(value))) {
                throw ex;
            }

        } else if (StrUtil.equals(colName, "重要性（文本说明）")) {

        } else if (StrUtil.equals(colName, "题库知识图谱")) {

        }
    }
}
